package org.hd.lineloss.fill.service.impl;


import com.alibaba.fastjson.JSONArray;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.hd.entities.LineLossFill;

import org.hd.entities.User;
import org.hd.lineloss.fill.dao.LineLossFillDao;
import org.hd.lineloss.fill.service.LineLossFillService;

import org.hd.login.dao.UserDao;
import org.hd.utils.exportExcelUtil.ExportExcel;
import org.hd.utils.jsonutils.JsonParseUtil;

import org.hd.utils.userutils.UserUtils;
import org.springframework.stereotype.Service;


import javax.annotation.Resource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
 public class LineLossFillServiceImpl implements LineLossFillService {

 @Resource
 LineLossFillDao lineLossFillDao;

 @Resource
 UserDao userDao;

 /**
  * 填报数据
  *
  * @param insertDate
  * @param username
  * @param luckySheetConfigStr
  * @return
  */
 @Override
 public boolean fillReport(String insertDate, String username, String luckySheetConfigStr,String insertTime) {
  //先查再插入
  LineLossFill lineLossFill = lineLossFillDao.queryReportByMonth(insertDate, username);

  //如果有数据，就update
  if(null !=lineLossFill){
    return lineLossFillDao.updateReport(insertDate,username,luckySheetConfigStr,insertTime);
  }
  //如果没数据，就插入一条新数据
  return lineLossFillDao.insertReport(insertDate,username,luckySheetConfigStr,insertTime);
 }




 /**
  * 获取填报模板。如果有当月填报的数据，就返回，如果没有的话就返回模板
  *
  * @param date
  * @param username
  * @return
  */
 @Override
 public Map<String,String> getFillReport(String date, String username) throws IOException {

     Map<String,String> map = new HashMap<>();
//     获取所有的用户列表
     List<User> userList = userDao.getUserList();
     List<LineLossFill> reports;
//     获取整个的大模板,转为string格式
     String temp = lineLossFillDao.getTemp().getLuckySheetConfigStr();
     JSONArray tempArray = JsonParseUtil.parseStrToJson(temp);
  //如果是hd用户，则可以查看所有报表,查看所有的以填报的数据
  if(username.equals("hd")) {
//除华东外的用户列表
      List<String> list = UserUtils.getUserList(userList, "hd");
//这是查询到的各个省市传入的数据的列表
      reports = lineLossFillDao.getReports(date);
//将大模板转为json数组

      //如果可以查到省市已经填报的数据的话
      if (reports.size() != 0) {
//将填报过的数据替换到大模板中
          for (int i = 0; i < tempArray.size(); i++) {
              for (int j = 0; j < reports.size(); j++) {
                  if (tempArray.getJSONObject(i).getString("name").equals(reports.get(j).getUsername())) {
                      tempArray.remove(i);
                      tempArray.add(i, JsonParseUtil.parseStrToJsonObj(reports.get(j).getLuckySheetConfigStr()));
                  }
              }
          }
          map.put("option",tempArray.toString());
          return map;
      }
  }

  //这里是非华东用户的查看
  //先查询一下看看有没有填报，只返回对应的一条数据
  LineLossFill lineLossFill = lineLossFillDao.queryReportByMonth(date, username);
  //如果已经填报过了。就返回当月填报的报表
  if(null != lineLossFill){
    map.put("option",lineLossFill.getLuckySheetConfigStr());
    return map;
//如果没有填报的话，就返回对应的模板，如sh-->sh的模板
  }else{
      for (int i = 0; i < tempArray.size(); i++) {
          if (tempArray.getJSONObject(i).getString("name").equals(username)){
              StringBuffer sb = new StringBuffer("[");
              sb.append(tempArray.getJSONObject(i).toString());
              sb.append("]");
              map.put("option",sb.toString());
              return map;
          }
      }
  }
  //如果没有填报的话，就返回模板
  map.put("option",temp);
  return map;
 }

    /**
     * 获取提交的时间,通过月份和用户名
     *
     * @param username
     * @param month
     * @return
     */
    @Override
    public String getFillDate(String username, String month) {
        return lineLossFillDao.getFillDate(username,month);
    }

    /***
     * 检查谁没有填报
     * @param month
     * @return
     */
    @Override
    public List<String> checkUnFill(String month) {

        List<User> userList = userDao.getUserList();

        List<String> unFillUser = new ArrayList<>();

        for(User u : userList){
            if(!u.getUsername().equals("hd")){
                unFillUser.add(u.getUsername());
            }
        }

        List<String> allInsertUser = lineLossFillDao.getAllInsertUser(month);
//        如果有人填报了，就比较一下
        if(allInsertUser.size() !=0){
            for(int i=0;i<unFillUser.size();i++){
                for(int j=0;j<allInsertUser.size();j++){
                    if(unFillUser.get(i).equals(allInsertUser.get(j))){
                        unFillUser.remove(i);
                    }
                }
            }
            return unFillUser;
        }

//        如果没人填报
        return unFillUser;
    }

    /***
     * 导出excel
     * @param option 字符串的配置
     * @return
     */
    @Override
    public XSSFWorkbook exportExcel(String option) {
        return ExportExcel.exportLuckySheetByPOI(option);
    }


}
